package com.xgz.ximport;

import com.xgz.bean.Cat;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author xgz
 */
public class MyImportRegistrar implements ImportBeanDefinitionRegistrar {

	/**
	 *
	 * @param importingClassMetadata  导入的类的注解元数据信息
	 * @param registry  bean定义注册器
	 * @param importBeanNameGenerator  导入的Bean的名字生成器
	**/
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
										BeanDefinitionRegistry registry,
										BeanNameGenerator importBeanNameGenerator) {

		registerBeanDefinitions(importingClassMetadata, registry);
	}

	/**
	 * 向bean定义注册器里面 注册Bean的定义信息，配合@Import注解，向容器导入组件
	 *
	 * spring扫描xml也好，注解也好，都会为了得到Bean定义信息，都会放到Bean定义注册器里面。
	 * 你可以直接向注册器里面添加 bean定义信息。
	 * <p>The default implementation is empty.
	 *
	 * @param importingClassMetadata 导入的Bean的注解元数据
	 * @param registry               当前Bean定义信息注册器
	 */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		// Bean 定义信息
		RootBeanDefinition catDefinition = new RootBeanDefinition();
		catDefinition.setBeanClass(Cat.class);
		// 给一个实例提供者，可以自己返回实例，不用Spring去推断创建实例
//		catDefinition.setInstanceSupplier(Cat::new);
		registry.registerBeanDefinition("tomCat", catDefinition);
	}

}
